/*
 * @lc app=leetcode.cn id=98 lang=cpp
 *
 * [98] 验证二叉搜索树
 */

// @lc code=start
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution
{
public:
    bool isValidBST(struct TreeNode *root)
    {
        return isBST(root, LONG_MIN, LONG_MAX);
    }

    int isBST(TreeNode *root, long long min, long long max)
    {
        //终止条件
        //到达终点 说明一路走来没有错
        if(!root)
            return 1;
        //中途出问题了 直接返回0退出
        if(root->val <= min || root->val >= max)
            return 0;
        
        //drill down  return && 两个必须同时满足才可以 即左右子树都正确无误皆可。
        return isBST(root->left, min, root->val) && isBST(root->right,root->val,max);
    }
};
// @lc code=end
